
// ECMAScript 委员会 对象操作 14种方法

// JS中很多命令是以关键字来进行操作 而不是通过方法式
// 如： in  instanceof  
// 实际上更希望 语言 能形成方法式的api
// 函数式方法 更清晰 更明了 扩展性强

// var obj = { a: 1, b: 2 };


// 1. 获取原型 [[GetPrototypeOf]] // [[]]：JS内部的一些变量和方法(api)
// var proto = Object.getPrototypeOf(obj)
// console.log(proto) // 通过底层方法获取
// console.log(obj.__proto__) // 通过对象本身的原型获取
// console.log(Object.prototype) // 通过构造函数的原型属性获取


// 2. 设置原型 [[SetPrototypeOf]]
// Object.setPrototypeOf(obj, { c: 3, d: 4 })
// or -> obj.__proto__ = xxx
// or -> Object.prototype = xxx
// console.log(obj)


// 3. 获取对象的可扩展性 [[IsExtensible]]
// 是否能追加、删除、枚举等
// var extensible = Object.isExtensible(obj)
// console.log(extensible)
// Object.freeze(obj) // 冻结对象

// var extensible2 = Object.isExtensible(obj)
// console.log(extensible2)


// 冻结对象 [[Freeze]]
// Object.freeze(obj)
// obj.c = 3 // 不可修改
// console.log(obj)

// delete obj.a // 不可删除
// console.log(obj)

// obj.b = 233 // 不可写
// console.log(obj)

// for (var key in obj) { // 可读、可枚举
//   console.log(obj[key])
// }


// 封闭对象 [[Seal]]
// Object.seal(obj)
// obj.c = 3 // 不可修改
// console.log(obj)

// delete obj.a // 不可删除
// console.log(obj)

// obj.b = 233 // 可写
// console.log(obj)

// for (var key in obj) { // 可读、可枚举
//   console.log(obj[key])
// }


// 4. 获取自有属性 [[GetOwnProperty]]
// Object.setPrototypeOf(obj, {c: 3, d: 4})
// 没有单独的 getOwnProperty
// getOwnPropertyNames 
// getOwnPropertyDescriptor
// getOwnPropertyDescriptors
// getOwnPropertySymbols
// console.log(Object.getOwnPropertyNames(obj))


// 5. 禁止扩展对象 [[PreventExtensions]]
// Object.preventExtensions(obj)
// obj.c = 3 // 禁止增加属性
// console.log(obj)
// delete obj.a // 可删除属性
// console.log(obj)


// 6. 拦截对象操作 [[DefineOwnProperty]]
// Object.defineProperty()
// Object.defineProperties()


// 7. 判断是否是自身属性 [[HasProperty]]
// console.log(obj.hasOwnProperty('a')) // true
// console.log(obj.hasOwnProperty('c')) // false


// 8. 判断、获取 [[GET]]
// console.log('c' in obj) // false
// console.log('a' in obj) // true
// console.log(obj.a)


// 9. 设置 [[SET]]
// obj.c = 33
// obj['b'] = 4
// console.log(obj)


// 10. 删除 [[Delete]]
// delete obj.a
// console.log(obj)


// 11. 枚举 [[Enumerate]]
// for(var k in obj) {
//   console.log(obj[k])
// }


// 12. 获取键集合 [[OwnPropertyKeys]]
// Object.setPrototypeOf(obj, { c: 3, b: 4 })
// console.log(Object.keys(obj))


// 13. 调用函数
// function test() {}; test();
// function test() {} test.call/apply
// obj.test = function () {};  obj.test();


// 14. 对类，实例化的过程
// function Test() {}; new Test();


